package com.yfp.client.service;

import com.github.binarywang.wxpay.bean.notify.WxPayPartnerRefundNotifyV3Result;
import com.yfp.client.domain.*;
import com.yfp.client.domain.Client;
import com.yfp.client.domain.OrderCombo;
import com.yfp.client.domain.OrderGiftGold;
import com.yfp.client.domain.OrderList;
import com.yfp.client.domain.dto.PayPasswordDTO;
import com.yfp.client.domain.dto.PayPasswordFreeDTO;
import com.yfp.client.domain.vo.ClientBalanceVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * @Description: 客户Service
 * 
 * @CreateDate: 2024/5/16 9:58
 * @UpdateUser: 
 * @UpdateDate: 2024/5/16 9:58
 * @UpdateRemark: 暂无修改
 * @Version: 1.0
 */
public interface ClientService {
    /**
     * 查询客户
     *
     * @param id
     * @return
     */
    Client getById(String id);

    /**
     * 查询客户
     *
     * @param openId
     * @return
     */
    Client getByOpenId(String openId);

    /**
     * 添加客户
     *
     * @param client
     */
    void add(Client client);

    /**
     * 查询客户
     *
     * @param mobile
     * @return
     */
    Client findByMobile(String mobile);

    /**
     * 修改客户
     *
     * @param client
     */
    void edit(Client client);

    /**
     * 清除openId
     *
     * @param id
     */
    void clearOpenId(String id);

    void clearMobile(String id);

    /**
     * 获取用户列表
     *
     * @return
     */
    List<Client> clientList();

    /**
     * 批量查询客户信息
     *
     * @param clientIdList
     */
    List<Client> getByIds(List<String> clientIdList);

    /**
     * 获取账户余额
     *
     * @return
     */
    ClientBalanceVO balance();

    /**
     * 是否设置过支付密码
     *
     * @return 存在true，不存在false
     */
    Boolean hasPayPassword();

    /**
     * 设置支付密码
     *
     * @param payPasswordDTO
     */
    void setPayPassword(PayPasswordDTO payPasswordDTO);

    /**
     * 余额免密支付
     * 判断免密支付按钮状态
     *
     * @return [0:关闭，1:开启]
     */
    Integer payPasswordFree();

    /**
     * 修改免密支付按钮状态
     * 开启需要输入支付密码，输入正确后按钮开启。
     * 关闭点击按钮，直接关闭。
     *
     * @param payPasswordFreeDTO
     */
    void payPasswordFree(PayPasswordFreeDTO payPasswordFreeDTO);

    /**
     * 重置支付密码-获取验证码
     */
    void resetPayPasswordGetCode();

    /**
     * 重置支付密码-校验密码‘下一步’按钮
     *
     * @param code
     * @return 存在true，不存在false
     */
    Boolean resetPayPasswordVerifyCode(String code);

    /**
     * 余额整单退款订单
     * 恢复充值金额、赠送金
     *
     * @param orderCombo
     */
    Client balanceRefundOrder(OrderCombo orderCombo);

    /**
     * 余额部分退款订单
     * 恢复充值金额、赠送金
     *
     * @param orderCombo
     * @param orderList
     */
    Client balanceRefundOrder(OrderCombo orderCombo, OrderList orderList);

    /**
     * 余额部分退款订单
     * 恢复充值金额、赠送金
     *
     * @param userId
     * @param orderGiftGolds
     */
    Client balanceRefundOrder(String userId, List<OrderGiftGold> orderGiftGolds);

    /**
     * 清空储值余额
     *
     * @param clientId
     */
    void emptyBalance(String clientId);

    /**
     * 储值退款回调
     *
     * @param wxPayPartnerRefundNotifyV3Result
     */
    void storedRefundNotify(WxPayPartnerRefundNotifyV3Result wxPayPartnerRefundNotifyV3Result);

    /**
     * 减少用户储值余额
     *
     * @param money
     * @param giftMoney
     * @return
     */
    Client balanceSub(BigDecimal money, BigDecimal giftMoney);

    /**
     * 用户打点位标签
     *
     * @param clientId
     * @param lastPositionId
     */
    void updatePositionId(String clientId, String lastPositionId);

    /**
     * 减少用户积分
     * 并记录日志
     *
     * @param clientId
     * @param integral
     * @param orderSn
     */
    void decreaseIntegralQuantity(String clientId, Long integral, String orderSn);

    /**
     * 恢复用户积分
     *
     * @param clientId
     * @param integral
     * @param orderSn
     */
    void recoverLockIntegralQuantity(String clientId, Long integral, String orderSn);

    /**
     * 退回积分
     *
     * @param clientId
     * @param integral
     */
    void returnIntegral(String clientId, Long integral);
}
